#ifndef __DATETIME_H__
#define __DATETIME_H__

#include <stdio.h>
#include <string>
#include <time.h>

using namespace std;

class DateTime
{
public:
   DateTime() {}
   DateTime(time_t seconds);
   DateTime(int year, int month, int day);
   DateTime(int year, int month, int day, int hour, int minute, int second);
   DateTime(string datetimeStr); //日期字符串格式 年/月/日 时:分:秒 例:2008/02/03 9:30:20 出错返回 01/01/1970 00:00:00
   DateTime(string datetimeStr, string formaterStr);

public:
   time_t seconds; //自1970起的秒数
   tm date;

public:
   void AddYears(const time_t years);                                  //将指定的年份数加到此实例的值上。
   void AddMonths(const time_t Months);                                //将指定的月份数加到此实例的值上。
   void AddDays(const time_t days);                                    //将指定的天数加到此实例的值上。
   void AddHours(const time_t hours);                                  //将指定的小时数加到此实例的值上。
   void AddMinutes(const time_t minutes);                              //将指定的分钟数加到此实例的值上。
   void AddSeconds(const time_t seconds);                              //将指定的秒数加到此实例的值上。
   void AddWeeks(const time_t weeks);                                  //将指定的周数加到些实上的值上。
   static int Compare(const DateTime *value1, const DateTime *value2); //	对两个 DateTime 的实例进行比较，并返回一个指示第一个实例是早于、等于还是晚于第二个实例的整数。
                                                                       // 返回值：小于零 value1 小于 value2。 零 value1 等于 value2。 大于零 value1 大于 value2。
   int CompareTo(const DateTime *value);                               //小于零 此实例小于 value。 零 此实例等于 value。 大于零 此实例大于 value。

   int DaysInMonth(const int year, const int months); //返回指定年和月中的天数。
   bool Equals(const DateTime *dateTime);
   static bool Equals(const DateTime *value1, const DateTime *value2);
   static DateTime Parse(string datetimeStr); //日期字符串格式 月/日/年 时:分:秒 例:02/03/2008 9:30:20 出错返回 01/01/1970 00:00:00
   static DateTime Parse(string dateTimeStr, string formaterStr);
   string ToShortDateString(); //将当前 DateTime 对象的值转换为其等效的短日期字符串表示形式。
   string ToString();
   const char *ToCString();
   string ToString(const string formaterStr);       //formaterStr = "%Y-%m-%d %H:%M:%S" %Y=年 %m=月 %d=日 %H=时 %M=分 %S=秒
   const char *ToCString(const string formaterStr); //formaterStr = "%Y-%m-%d %H:%M:%S" %Y=年 %m=月 %d=日 %H=时 %M=分 %S=秒
   string ToZoneString();                           //返回带时区信息的字符串
   //
   string ToKZZoneString(); // 返回空中网日志需要的带时区信息的字符串
   string ToKZLogTime();

public:
   int GetYear();               //获取此实例所表示日期的年份部分。
   int GetMonth();              //获取此实例所表示日期的年份部分。
   int GetDay();                // 获取此实例所表示的日期为该月中的第几天。
   int GetHour();               //获取此实例所表示日期的小时部分。
   int GetMinute();             //获取此实例所表示日期的分钟部分
   int GetSecond();             //获取此实例所表示日期的秒部分。
   int DayOfWeek();             //获取此实例所表示的日期是星期几。
   int DayOfYear();             //记录今天是一年里面的第几天,从1月1日起,0-365
   static DateTime GetNow();    //返回当前日期
   void Now(unsigned long sec); //设置当前日期
   unsigned long getUnixTimeSec();
   void InitByStr(string dateTimeStr, string formaterStr);
   static unsigned int GetDaysInMonth(unsigned int year, unsigned int month); // 获取某年的某月一共有多少天
   static bool isLeapYear(unsigned int year);
   static int getDayOffset(DateTime &before, DateTime &after);

public:
   bool operator==(DateTime &dateTime);
   bool operator>(DateTime &dateTime);
   bool operator<(DateTime &DateTime);
   bool operator>=(DateTime &DateTime);
   bool operator<=(DateTime &DateTime);
   bool operator!=(DateTime &DateTime);
};

#endif